<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 构造函数Promise的方法  => 构造函数Promise自己使用(类似 Array.isArray Array.from)

    // Promise.all()
    // Promise.allSettled()
    // Promise.race()
    // Promise.any()

    // 现有对象转为 Promise 对象，Promise.resolve(),Promise.reject()方法就起到这个作用
    // Promise.resolve()  快速返回Promise对象 
    // 1. 传入一个参数,返回成功状态的Promise实例 (该参数回作为Promise实例的数据存储)
    // 2. 传入一个Promise对象, 直接返回该Promise对象
    // 3. 传入一个thenable对象(有then方法的对象 {then:function(){}})

    // 得到一个Promise实例  => 存储数据 
    // var p = new Promise(function (resolve, reject) {
    //     resolve(1);  // {<fulfilled>:1}
    // })
    // console.log(p);

    // (1) 
    // var p = Promise.resolve(1);  // {<fulfilled>:1}
    // console.log(p);

    // (2)
    // var p1 = getNumAsync(1, 2000); // {<pending>:undefined}
    // var p = Promise.resolve(p1);
    // console.log(p);
    // console.log(p === p1);

    // (3) 用于处理异步操作  => 返回一个Promise实例 => 根据异步操作的结果改变状态
    // var p = Promise.resolve({
    //     then: function (resolve, reject) {
    //         setTimeout(function () {
    //             var num = Math.random();
    //             console.log("num", num);
    //             if (num > 0.5) {
    //                 resolve(true);
    //             } else {
    //                 reject(false);
    //             }
    //         }, 1000)
    //     }
    // })
    // console.log(p);
    // p.then(arg => {
    //     console.log("fulfilled", arg);
    // }).catch(err => {
    //     console.log("rejected", err);
    // })



    // Promise.reject()  快速返回Promise对象 
    // 1. 传入一个参数,返回已失败状态的Promise实例(该参数回作为Promise实例的数据存储)

    // var p = new Promise(function (resolve, reject) {
    //     rejected(1);  // {<rejected>:1}
    // })
    // console.log(p);

    // var p = Promise.reject(1);
    // console.log(p);


    var p1 = getNumAsync(1, 2000); // {<pending>:undefined}
    var p = Promise.reject(p1);   // {<rejected>:p1}
    console.log(p);





    // Promise封装的异步操作 => 调用此方法会立即返回Promise实例(进行中) => 指定时间之后变为成功或失败的状态
    function getNumAsync(num = 0, delay = 0, isFulfilled = true) {
        var p = new Promise(function (resolve, reject) { // 形参
            setTimeout(function () {
                isFulfilled ? resolve(num) : reject(num);
            }, delay)
        });
        return p;  // 返回Promise对象  {<pending>:undefined}
    }
</script>

</html>